<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>   
        //预编译
        // 1：创建AO对象（action object）
        // 2：找形式参数和变量声明赋值为undefined
        // 3：将实参的值复制给形式参数
        // 4：找函数申明  赋值为 该函数体


        //运行test和new test 执行结果是什么
        // var a = 5;
        // function test(){
        //     a = 0;
        //     alert(a);
        //     alert(this.a);
        //     var a;
        //     alert(a);
        // }
        // test();//0,5,0
        // new test();//0,undefined,0

        // function Test(name,age){
        //     this.name = 'whh';
        //     this.age = 19;
        // }
        // var test = new Test('abc',11);
        // console.log(test.name);//whh
        // console.log(test.age);//19

        // function Person(name,age,sex){
        //     var a = 0;
        //     this.name = name;
        //     this.age = age;
        //     this.sex = sex;
        //     this.say = function(){
        //         a ++;
        //         console.log(a);
        //     }
        // }
        // var person1 = new Person();
        // person1.say();//1
        // person1.say();//2
        // var person2 = new Person();
        // person2.say();//1


        // function conso(obj){
        //     if(obj instanceof Array){
        //         console.log('数组');
        //     }else{
        //         console.log('对象');
        //     }
        // }
        // var obj = {
        //     name:'whh',
        //     age:18
        // }

        // var x = 0, y = z = 0;
        // function add(n){
        //     return n =  n + 1;
        // }
        // y = add(x);
        // function add(n){
        //     return n = n + 3;
        // }
        // z = add(x);
    // x:0;
    // y:3;
    // z:3;
    // function foo(x){
    //     console.log(arguments);
    //     return x;
    // }
    // foo(1,2,3,4,5);
    //[1,2,3,4,5]
    //1

    // function bar(){
    //     foo.apply(null,arguments);
    // }
    // function foo(){
    //     console.log(arguments);
    // }
    // bar(1,2,3,4,5);

    // var f = (
    //     function f(){
    //         return '1';
    //     },
    //     function g(){
    //         return 2;
    //     }
    // )();
    // typeof f;//2

    // var x = 1;
    // if(function f(){}){
    //     x += typeof f;
    // }
    // console.log(x);
    // //1:if(function f(){}) 会把function f(){}转换为表达式，之后销毁;
    // //结果是 1undefined

    // undefined == 0;//false
    // undefined < 0//false
    // undefined > 0//false

    // null == 0;//false
    // null < 0//false
    // null > 0//false

    // undefined == null;//true
    // undefined === null;//false

    // isNaN('199');//true
    // isNaN(199);//true
    // isNaN('abc');//true

    // parseInt('1a');//1
    // parseInt('a1');//NaN
    // parseInt(NaN);//NaN

    // var foo = 123;
    // function test(){
    //     var foo = 345;
    //     this.foo = 789;
    //     console.log(foo);
    // }
    // test();

    // var name = 'lih'
    // var obj = {
    //     name:'whh',
    //     b:function(){
    //         console.log(name + this.name);
    //     }            
    // }
    // obj.b();//lihwhh
    // obj.b.call();//lihlih
    // obj.b.call(this);//lihlih
    // obj.b.call(obj);//lihwhh
    // obj.b.call(null);//lihlih
    
    // var name = 111;
    // var a = {
    //     name : 222,
    //     say : function(){
    //         console.log(this.name);
    //     }
    // }
    // var fun = a.say;
    // fun();//111
    // a.say();//a 调用 say方法执行 222


    // var b = {
    //     name : "333",        
    //     say : function(fun){
    //         fun();
    //     },
    // }
    // b.say(a.say);//111
    // b.say = a.say;
    // b.say();//333

    // var bar = {
    //     a : '002'
    // }
    // function print(){
    //     bar.a = 'a';
    //     Object.prototype.b = 'b';
    //     return function inner(){
    //         console.log( bar.a );
    //         console.log( bar.b );
    //     }
    // }
    // print()();//a , b


    // var obj = {
    //     card: [11,22],
    //     name : 'whh',
    //     age : 18,
    //     sex : 'female',
    //     o : {
    //         name:'abc',
    //         gift:{
    //             toy:'www'
    //         }
    //     }
    // }

    // function deepClone(origin,target){

    //     var toS = Object.prototype.toString;

    //     if(toS.call(origin) === "[object Array]")
    //         var target = target || [];
    //     if(toS.call(origin) === "[object Object]")
    //         var target = target || {};

    //     for( var prop in origin){
    //         if(origin.hasOwnProperty(prop)){
    //             switch(toS.call(origin[prop])){
    //             case "[object Object]":
    //             target[prop] = deepClone(origin[prop],target[prop]);
    //             break;
    //             case "[object Array]":
    //             target[prop] = deepClone(origin[prop],target[prop]);
    //             break;  
    //             default:
    //             target[prop] = origin[prop];
    //             }
    //         }          
    //     }
    //     return target;
    // }


    // var obj1 = deepClone(obj);

        // function deepClone(origin, target){

        //     var target = target || {};
        //     var toS = Object.prototype.toString;
        //     var arrStr = "[object Array]";

        //     for(var prop in origin){
        //         if(origin.hasOwnProperty(prop)){
        //             if(typeof(origin[prop]) == 'object'){
        //                 if(toS.call(origin[prop]) == arrStr){
        //                     target[prop] = [];
        //                 }else{
        //                     target[prop] = {};
        //                 }
        //                 deepClone(origin[prop],target[prop]);
        //             }else{
        //                 target[prop] = origin[prop];
        //             }
        //         }
        //     }
        //     return target;
        // }
        // var obj1 = deepClone(obj);


            class Person {
                constructor(name, age){
                    this.name = name;
                    this.age = age;
                }
                say() {
                    console.log('say');
                }
            }
            
            class Student extends Person {
                constructor(name, age, grade){
                    super(name, age);
                    this.grade = grade;
                }
                sayHello() {
                    console.log('hew');
                }
            }
        
    </script>
</body>
</html>